package com.ahdy.controller;

import com.ahdy.tool.AliOSSUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * 文件上传控制器
 */
@RestController
@RequestMapping("/api/file")
@RequiredArgsConstructor
@Slf4j
public class FileUploadController {

    private final AliOSSUtils aliOSSUtils;

    /**
     * 上传文件到阿里云OSS
     * 
     * @param file 文件
     * @return 包含文件URL的响应
     */
    @PostMapping("/upload")
    public ResponseEntity<Map<String, Object>> uploadFile(@RequestParam("file") MultipartFile file) {
        Map<String, Object> result = new HashMap<>();

        try {
            // 检查文件是否为空
            if (file.isEmpty()) {
                result.put("code", 400);
                result.put("msg", "上传文件不能为空");
                return ResponseEntity.badRequest().body(result);
            }

            // 移除了文件类型限制，支持所有类型文件上传

            // 上传文件到阿里云OSS
            String url = aliOSSUtils.upload(file);
            log.info("文件上传成功，访问地址: {}", url);

            // 返回成功结果
            result.put("code", 200);
            result.put("msg", "上传成功");
            result.put("data", url);
            return ResponseEntity.ok(result);
        } catch (IOException e) {
            log.error("文件上传失败", e);
            result.put("code", 500);
            result.put("msg", "上传失败：" + e.getMessage());
            return ResponseEntity.status(500).body(result);
        }
    }

    /**
     * 上传文件到自定义目录
     * 
     * @param file      文件
     * @param directory 目录名称
     * @return 包含文件URL的响应
     */
    @PostMapping("/upload/custom")
    public ResponseEntity<Map<String, Object>> uploadFileToCustomDirectory(
            @RequestParam("file") MultipartFile file,
            @RequestParam(value = "directory", defaultValue = "custom/") String directory) {

        Map<String, Object> result = new HashMap<>();

        try {
            // 检查文件是否为空
            if (file.isEmpty()) {
                result.put("code", 400);
                result.put("msg", "上传文件不能为空");
                return ResponseEntity.badRequest().body(result);
            }

            // 移除了文件类型限制，支持所有类型文件上传

            // 确保目录以/结尾
            if (!directory.endsWith("/")) {
                directory += "/";
            }

            // 上传文件到自定义目录
            String url = aliOSSUtils.upload(file, directory);
            log.info("文件上传成功，访问地址: {}", url);

            // 返回成功结果
            result.put("code", 200);
            result.put("msg", "上传成功");
            result.put("data", url);
            return ResponseEntity.ok(result);
        } catch (IOException e) {
            log.error("文件上传失败", e);
            result.put("code", 500);
            result.put("msg", "上传失败：" + e.getMessage());
            return ResponseEntity.status(500).body(result);
        }
    }

    /**
     * 删除已上传的文件
     * 
     * @param fileUrl 文件URL
     * @return 删除结果
     */
    @PostMapping("/delete")
    public ResponseEntity<Map<String, Object>> deleteFile(@RequestParam("fileUrl") String fileUrl) {
        Map<String, Object> result = new HashMap<>();

        try {
            boolean deleted = aliOSSUtils.deleteFile(fileUrl);

            if (deleted) {
                result.put("code", 200);
                result.put("msg", "删除成功");
            } else {
                result.put("code", 400);
                result.put("msg", "删除失败");
            }

            return ResponseEntity.ok(result);
        } catch (Exception e) {
            log.error("删除文件失败", e);
            result.put("code", 500);
            result.put("msg", "删除失败：" + e.getMessage());
            return ResponseEntity.status(500).body(result);
        }
    }
}